
// Déclaration et création
#include <cv.h>
#include <highgui.h>
#include <stdio.h>

//  qui calcule (et stocke dans l'image dest), la valeur absolue de la différence pixel à  pixel des images src1 et src2 (données en niveaux de gris).
void difference_absolue ( const cv::Mat& src1, const cv::Mat& src2, cv::Mat& dest )
{
      for(int r = 0; r < src1.rows; r++)
        for(int c = 0; c < src2.cols; c++)
            dest.at<uchar>(r,c) = sqrt(pow( src1.at<uchar>( r, c) - src2.at<uchar>( r, c),2));
}
//
//    qui renvoie la somme (normalisée) des valeurs des pixels de l'image src.
//    somme =  Σ ( p.valeur / 256 ),  p ∈ src           (1)
//    somme normalisee 	= somme / (  src.w * src.h )    (2)
float somme_normalisee ( const cv::Mat& src )
{
    float somme = 0;
    for(int r = 0; r < src.rows; r++)
        for(int c = 0; c < src.cols; c++)
            somme +=  src.at<uchar>(r,c);

    somme /= 256;
    return somme / (  src.cols * src.rows);
}



int main(int argc, char *argv[] )
{
    char *nomVideo = argv[1];
    float th =atof(argv[2]);// 0.004;


    /* ouverture de la video */
    cv::VideoCapture video(nomVideo);
    if( ! video.isOpened() )
      exit(1);

    cv::namedWindow("Video");
    cv::namedWindow("Scene");
    cv::namedWindow("Diff");

    cv::Mat im,imOld,imNVG,imScene,imDiff;

    float SMImg = 0,SMImgOld = 0;

    while( video.grab() )
    {
        SMImgOld = SMImg;

        video.retrieve(im);
        cv::cvtColor(im,imNVG,CV_BGR2GRAY);

        SMImg = somme_normalisee(imNVG);

        cv::imshow( "Video",imNVG);
//        printf("%f\n", sqrt(pow(SMImg -SMImgOld ,2)));

        if(sqrt(pow(SMImg -SMImgOld ,2)) > th)
           {
                imScene = imNVG.clone();
                cv::imshow( "Scene",imScene);
           }

        imDiff = imNVG.clone();
        difference_absolue(imNVG,imScene,imDiff);
        cv::imshow( "Diff",imDiff);

        cv::waitKey(40);

      int key = 255 & cvWaitKey(5);
      if( key == 27 ) // code ASCII de escape
        break; // Sortir...
    }

    return 0;
}









/// g++ -g -I /usr/include/opencv  tp1.cpp -o tp1 -lcv -lcxcore -lhighgui



/// partie video

//    /* ouverture de la video */
//    cv::VideoCapture video("video.avi");
//    if( ! video.isOpened() )
//      exit(1);
//
//    cv::namedWindow("Ma fenetre");
//
//    cv::Mat im,imNVG;
//    while( video.grab() )
//    {
//      video.retrieve(im);
//      cv::cvtColor(im,imNVG,CV_BGR2GRAY);
//        cv::imshow( "Ma fenetre",imNVG);
//        cv::waitKey(40);
//
//      int key = 255 & cvWaitKey(5);
//      if( key == 27 ) // code ASCII de escape
//        break; // Sortir...
//    }

/// partie photo val diff
//    char nomImg1[30];
//    char nomImg2[30];
//    sprintf(nomImg1, argv[1]);
//    sprintf(nomImg2, argv[2]);
//    printf("%s",nomImg1);
//
//    cv::Mat im1,im2;
//
//    im1 = cv::imread( nomImg1, 0);
//    im2 = cv::imread( nomImg2, 0);
//
//    difference_absolue(im1,im2,im2);
//    cv::namedWindow("Ma fenetre");
//    cv::imshow( "Ma fenetre", im2);
//    cv::waitKey(0);
//    return 0;
/// somme normalisee

//    char *nomImg1 = argv[1];
//
//    cv::Mat im1;
//    im1 = cv::imread( nomImg1, 0);
//
//    float somme = somme_normalisee (im1 );
//    printf("\nSomme normalisee : %f\n", somme);
//
//    return 0;

/// kung pow !
//  char *nomVideo = argv[1];
//    float th = 0.004;
//
//    /* ouverture de la video */
//    cv::VideoCapture video(nomVideo);
//    if( ! video.isOpened() )
//      exit(1);
//
//    cv::namedWindow("Video");
//    cv::namedWindow("Scene");
//
//    cv::Mat im,imOld,imNVG;
//
//    float SMImg = 0,SMImgOld = 0;
//
//    while( video.grab() )
//    {
//        SMImgOld = SMImg;
//
//        video.retrieve(im);
//        cv::cvtColor(im,imNVG,CV_BGR2GRAY);
//
//        SMImg = somme_normalisee(imNVG);
//
//        cv::imshow( "Video",imNVG);
//        printf("%f\n", sqrt(pow(SMImg -SMImgOld ,2)));
//
//        if(sqrt(pow(SMImg -SMImgOld ,2)) > th)
//            cv::imshow( "Scene",imNVG);
//
//        cv::waitKey(40);
//
//      int key = 255 & cvWaitKey(5);
//      if( key == 27 ) // code ASCII de escape
//        break; // Sortir...
//    }
//
//    return 0;
/// kung pow 2
//    char *nomVideo = argv[1];
//    float th =atof(argv[2]);// 0.004;
//
//
//    /* ouverture de la video */
//    cv::VideoCapture video(nomVideo);
//    if( ! video.isOpened() )
//      exit(1);
//
//    cv::namedWindow("Video");
//    cv::namedWindow("Scene");
//    cv::namedWindow("Diff");
//
//    cv::Mat im,imOld,imNVG,imScene,imDiff;
//
//    float SMImg = 0,SMImgOld = 0;
//
//    while( video.grab() )
//    {
//        SMImgOld = SMImg;
//
//        video.retrieve(im);
//        cv::cvtColor(im,imNVG,CV_BGR2GRAY);
//
//        SMImg = somme_normalisee(imNVG);
//
//        cv::imshow( "Video",imNVG);
////        printf("%f\n", sqrt(pow(SMImg -SMImgOld ,2)));
//
//        if(sqrt(pow(SMImg -SMImgOld ,2)) > th)
//           {
//                imScene = imNVG.clone();
//                cv::imshow( "Scene",imScene);
//           }
//
//        imDiff = imNVG.clone();
//        difference_absolue(imNVG,imScene,imDiff);
//        cv::imshow( "Diff",imDiff);
//
//        cv::waitKey(40);
//
//      int key = 255 & cvWaitKey(5);
//      if( key == 27 ) // code ASCII de escape
//        break; // Sortir...
//    }
//
//    return 0;
